package Test;

import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;

/**
 * 机试题目：
 * 自定义一个注解@Packet，提供2个属性len和hex，len属性指定字段的长度，hex属性指定字段是否是十六进制，默认不是十六进制，
 * 请完成calLen和convertToByteArray 2个方法的编码
 *
 */
public class Test {

	/**
	 * 计算iPacket类对象的总长度，即子类及基类所有字段由@Packet的len属性指定的长度的总和
	 * @param iPacket 请求消息类对象
	 * @return 类对象总长度
	 */
	public static <T extends Request> int calLen(T iPacket) throws Exception {
		int l = 0;
		Field[] fields = iPacket.getClass().getDeclaredFields();
		for (int i = 0; i < fields.length - 1; i++) {
			l += iPacket.getClass().getDeclaredField(fields[i].toString()).getAnnotation(Packet.class).len();
		}
		return l;
	}

	/**
	 * 将iPacket类对象的值转换为byte数组，@Packet的len属性指定的是字段值转换为byte数组后的长度，
	 * 对于@Packet注解的hex属性为1的字段，需要转为十六进制byte数组
	 * @param iPacket 请求消息类对象
	 * @return 转换后的byte数组
	 */
	public static <T extends Request> byte[] convertToByteArray(T iPacket) throws NoSuchFieldException {
		String str = "";
		Field[] fields = iPacket.getClass().getDeclaredFields();
		for (int i = 0; i < fields.length - 1; i++) {
			if(iPacket.getClass().getDeclaredField(fields[i].toString()).getAnnotation(Packet.class).hex()==1){
				/**
				 * 把fields[i]转换为十六进制byte数组
				 */
			}
			str += iPacket.getClass().getDeclaredField(fields[i].toString());
		}

		return str.getBytes();
	}

	public static void main(String[] args) throws Exception {


		EncryptDataRequest req = new EncryptDataRequest();
//		req.setSplitFlag(new byte[]{0x0a, 0x75});
//		req.setMsgID(100);
//		req.setMsgType(100);
//		req.setKeyName("SM2");
//		req.setData("12345".getBytes());
//		req.setIV("12345678123456781234567812345678".getBytes());

		System.out.println("len:" + convertToByteArray(req));
		System.out.println("convert result:" + convertToByteArray(req));
	}

}
